from django.db import models
import datetime

sex_choice = [
    (1, "男"),
    (0, "女"),
]

yesno_choice = [
    (1, "是"),
    (0, "否"),
]


class InPatientsModel(models.Model):
    # 1.患者入组模型
    姓名 = models.CharField(max_length=10)
    床号 = models.CharField(max_length=10, blank=True, null=True)
    住院号 = models.CharField(max_length=10, unique=True)
    年龄 = models.SmallIntegerField(blank=True, null=True, verbose_name="年龄（岁）")
    性别 = models.SmallIntegerField(choices=sex_choice)
    病区 = models.CharField(max_length=10, blank=True, null=True)
    诊断 = models.CharField(max_length=25)
    电话 = models.CharField(max_length=25)
    入院日期 = models.DateField(blank=True, null=True)
    管组教授 = models.CharField(max_length=10, blank=True, null=True)
    手术日期 = models.DateField(blank=True, null=True)
    入组日期 = models.DateField(blank=True, null=True)
    ECOG评分 = models.SmallIntegerField(blank=True,
                                      null=True,
                                      choices=[(0, "活动能力完全正常，与起病前活动能力无任何差异"),
                                               (1, "能自由走动及从事轻体力活动，包括一般家务或办公室工作，但不能从事较重的体力活动"),
                                               (2, "能自由走动及生活自理，但已丧失工作能力，日间不少于一半时间可以起床活动"),
                                               (3, "生活仅能部分自理，日间一半以上时间卧床或坐轮椅"), (4, "卧床不起，生活不能自理"), (5, "死亡")])
    GLIM诊断 = models.CharField(max_length=10,
                              choices=[("轻度营养不良", "轻度营养不良"), ("中度营养不良", "中度营养不良"), ("重度营养不良", "重度营养不良")],
                              blank=True,
                              null=True)
    饮食习惯 = models.CharField(max_length=25, blank=True, null=True)
    体重下降 = models.DecimalField(decimal_places=3, max_digits=8, blank=True, null=True, verbose_name="体重下降（kg）")
    进食量减少 = models.CharField(max_length=20,
                             choices=[("未减少", "未减少"), ("25-49%", "25-59%"), ("50-74%", "50-74%"),
                                      ("75-100%", "75-100%")],
                             blank=True,
                             null=True)
    膳食总结 = models.SmallIntegerField(choices=[(1, "1分-以清流食为主，无肉、缺油。热量小于300kcal"), (2, "2分-三餐半流食，无肉、缺油。热量300-600kcal"),
                                             (3, "3分-一餐正餐，两餐半流食，基本无肉，少油。热量600-900kcal "),
                                             (4, "4分-两餐正餐，一餐半流食，少肉，少油。热量900-1200kcal"),
                                             (5, "5分-三餐正常餐，主食、肉蛋、油脂充足。热量1200-1500kcal")],
                                    blank=True,
                                    null=True)
    干预方式 = models.CharField(max_length=50, blank=True, null=True)
    ONS = models.CharField(max_length=100, blank=True, null=True)
    饮水吞咽试验 = models.SmallIntegerField(blank=True,
                                      null=True,
                                      help_text="让患者喝1－2勺水，如无问题，瞩患者取坐位，将30ml温水递给患者，让其“像平常一样喝下”，记录饮水情况",
                                      choices=[(1, "可一口喝完，无噎呛"), (2, "分两次以上喝完，无噎呛"), (3, "能一次喝完，但有噎呛"),
                                               (4, "分两次以上喝完，且有噎呛"), (5, "常常呛住，难以全部喝完")])
    血糖正常 = models.SmallIntegerField(choices=yesno_choice, blank=True, null=True)
    营养缺乏症状 = models.CharField(max_length=100, blank=True, null=True)
    出院状态 = models.CharField(max_length=10,
                            choices=[("好转", "好转"), ("未愈", "未愈"), ("死亡", "死亡"), ("转至其他医疗机构", "转至其他医疗机构"),
                                     ("自行出院", "自行出院")],
                            blank=True,
                            null=True)
    出院体重 = models.SmallIntegerField(blank=True, null=True, verbose_name="出院体重（kg）")
    出院营养状况描述 = models.TextField(blank=True, null=True, help_text="体重、食欲、食量、消化等")
    操作者 = models.CharField(max_length=10, blank=True, null=True, help_text="默认为当前用户")
    更新时间 = models.DateTimeField(default=datetime.datetime.now())

    def countBodyComposition_related(self):
        #返回子表计数
        return "共" + str(self.BodyComposition_related.all().count()) + "条记录"

    countBodyComposition_related.short_description = '人体成分评估'

    def countBMRmodel_related(self):
        #返回子表计数
        return "共" + str(self.BMRmodel_related.all().count()) + "条记录"

    countBMRmodel_related.short_description = '基础代谢率评估'

    def countInnerNutrition_related(self):
        #返回子表计数
        return "共" + str(self.InnerNutrition_related.all().count()) + "条记录"

    countInnerNutrition_related.short_description = '肠内营养耐受评估'

    def countNRS_related(self):
        #返回子表计数
        return "共" + str(self.NRS_related.all().count()) + "条记录"

    countNRS_related.short_description = 'NRS简表评估'

    def countfollowAccess_related(self):
        #返回子表计数
        return "共" + str(self.followAccess_related.all().count()) + "条记录"

    countfollowAccess_related.short_description = '实验室检查评估'

    def __str__(self):
        return str(self.住院号) + "[" + self.姓名 + "]"

    class Meta:
        verbose_name = "入组评估"
        verbose_name_plural = "1.入组评估"


#2.人体成分子表---InPatientsModel
class BodyCompositionModel(models.Model):
    患者 = models.ForeignKey(to="InPatientsModel",
                           on_delete=models.PROTECT,
                           verbose_name="患者",
                           related_name="BodyComposition_related")
    身高 = models.DecimalField(
        blank=True,
        null=True,
        verbose_name="身高（cm）",
        decimal_places=0,
        max_digits=3,
    )
    体重 = models.DecimalField(
        blank=True,
        null=True,
        verbose_name="体重（kg）",
        decimal_places=1,
        max_digits=4,
    )
    BMI = models.CharField(max_length=20, blank=True, null=True, help_text="18.5～23.9：正常；<18.5：过轻；24～27.9：过重；>=28：肥胖")
    骨骼肌 = models.SmallIntegerField(blank=True, null=True, verbose_name="骨骼肌（kg）")
    体脂肪 = models.DecimalField(decimal_places=1, max_digits=4, blank=True, null=True, verbose_name="体脂肪（kg）")
    年龄 = models.DecimalField(
        blank=True,
        null=True,
        decimal_places=0,
        max_digits=3,
    )
    性别 = models.SmallIntegerField(choices=sex_choice, blank=True, null=True)
    体脂率 = models.CharField(max_length=20, blank=True, null=True, help_text="正常男性体脂率为15-18%，女性体脂率正常为20-25%。")
    身体总水分 = models.SmallIntegerField(blank=True, null=True, verbose_name="身体总水分（kg）")
    评估人 = models.CharField(max_length=10, blank=True, null=True, help_text="默认为当前用户")
    评估时间 = models.DateTimeField(default=datetime.datetime.now())

    def __str__(self):
        return str(self.患者) + "[" + str(self.评估时间) + "]"

    class Meta:
        verbose_name = "人体成分评估"
        verbose_name_plural = "3.人体成分评估"


# 2.NRS营养风险筛查
class NrsModel(models.Model):
    患者 = models.ForeignKey(to="InPatientsModel",
                           on_delete=models.PROTECT,
                           to_field="住院号",
                           verbose_name="患者",
                           related_name="NRS_related")
    疾病严重程度 = models.SmallIntegerField(choices=[
        (0, "正常"),
        (1, "营养需要量轻度增加的疾病，包括髋骨折、慢性疾病急性发作或有并发症者、COPD、血液透析、肝硬化、一般恶性肿瘤"),
        (2, "营养需要量中度增加的疾病，包括腹部大手术、脑卒中、重度肺炎、血液恶性肿瘤"),
        (3, "营养需要量重度增加的疾病，包括颅脑损伤、骨髓移植、大于APACHE10的ICU患者"),
    ])
    营养受损状况 = models.SmallIntegerField(choices=[
        (0, "正常"),
        (1, "近3个月体重下降>5%，或近1周内进食量减少25~50%"),
        (2, "近2个月体重下降>5%，或近1周内进食量减少50~75%"),
        (3, "近1个月体重下降>5%，或近1周内进食量减少75%以上，或BMI<18.5及一般情况差"),
    ])
    年龄 = models.SmallIntegerField(choices=[
        (0, "<=70"),
        (1, ">70"),
    ])
    NRS得分 = models.SmallIntegerField(blank=True,
                                     null=True,
                                     help_text="0-2分，无风险，若患者将接受重大手术，需每周重新评估；3分及以上，患者有营养不良风险，需要营养支持治疗")
    评估人 = models.CharField(max_length=10, blank=True, null=True, help_text="默认为当前用户")
    评估时间 = models.DateTimeField(default=datetime.datetime.now())

    def __str__(self):
        return str(self.患者) + "[" + str(self.评估时间) + "]"

    class Meta:
        verbose_name = "NRS营养风险筛查"
        verbose_name_plural = "2.NRS营养风险筛查"


# 3.实验室检查
class LaboratoryAccessModel(models.Model):
    患者 = models.ForeignKey(to="InPatientsModel",
                           on_delete=models.PROTECT,
                           to_field="住院号",
                           verbose_name="患者",
                           related_name="followAccess_related")
    血脂 = models.CharField(max_length=20, blank=True, null=True)
    血压 = models.CharField(max_length=10, blank=True, null=True)
    血糖 = models.CharField(max_length=10, blank=True, null=True)
    血常规 = models.CharField(max_length=50, blank=True, null=True)
    肝肾功能 = models.CharField(max_length=50, blank=True, null=True)
    CRP = models.CharField(max_length=10, blank=True, null=True, verbose_name="C-反应蛋白")
    IL6 = models.CharField(max_length=10, blank=True, null=True, verbose_name="白细胞介素-6")
    PCT = models.CharField(max_length=10, blank=True, null=True, verbose_name="降钙素原")
    评估人 = models.CharField(max_length=10, blank=True, null=True, help_text="默认为当前用户")
    评估时间 = models.DateTimeField(default=datetime.datetime.now())

    def __str__(self):
        return str(self.患者) + "[" + str(self.评估时间) + "]"

    class Meta:
        verbose_name = "实验室检查"
        verbose_name_plural = "3.实验室检查"


#4.基础代谢率
class BMRModel(models.Model):
    患者 = models.ForeignKey(to="InPatientsModel",
                           on_delete=models.PROTECT,
                           verbose_name="患者",
                           related_name="BMRmodel_related")
    收缩压 = models.DecimalField(decimal_places=0, max_digits=3, verbose_name="收缩压（mmHg）")
    舒张压 = models.DecimalField(decimal_places=0, max_digits=3, verbose_name="舒张压（mmHg）")
    脉搏数 = models.DecimalField(
        decimal_places=0,
        max_digits=3,
    )
    基础代谢率 = models.CharField(max_length=10, blank=True, null=True, help_text="正常值区间-15%~15%")
    评估人 = models.CharField(max_length=10, blank=True, null=True, help_text="默认为当前用户")
    评估时间 = models.DateTimeField(default=datetime.datetime.now())

    def __str__(self):
        return str(self.患者) + "[" + str(self.评估时间) + "]"

    class Meta:
        verbose_name = "基础代谢率"
        verbose_name_plural = "4.基础代谢率"


# 5.肠内营养耐受评估
class NutrtionToleranceModel(models.Model):
    患者 = models.ForeignKey(to="InPatientsModel",
                           on_delete=models.PROTECT,
                           to_field="住院号",
                           verbose_name="患者",
                           related_name="InnerNutrition_related")
    总目标热量 = models.SmallIntegerField(blank=True, null=True)
    肠内剂型 = models.CharField(max_length=100, blank=True, null=True)
    肠内热量 = models.SmallIntegerField(blank=True, null=True)
    肠内营养相关并发症 = models.CharField(max_length=100, blank=True, null=True)
    胃肠道症状 = models.CharField(max_length=100, blank=True, null=True)
    腹痛腹胀 = models.SmallIntegerField(choices=[
        (0, "0分，无"),
        (1, "1分，轻度腹胀无腹痛"),
        (2, "2分，明显腹胀或腹内压15~20mmHg或能自行缓解的腹痛"),
        (3, "5分，严重腹胀或腹内压＞20mmHg或腹痛不能自己缓解"),
    ],
                                    verbose_name="腹痛/腹胀",
                                    null=True,
                                    blank=True)
    恶心呕吐 = models.SmallIntegerField(choices=[
        (0, "0分，无恶心呕吐或持续胃肠减压无症状"),
        (1, "1分，有恶心无呕吐"),
        (2, "2分，恶心呕吐，但不需胃肠减压或250ml＜GRV＜500ml"),
        (3, "5分，呕吐，且胃肠减压肠减压或GRV＞500ml"),
    ],
                                    verbose_name="恶心/呕吐",
                                    null=True,
                                    blank=True)
    腹泻 = models.SmallIntegerField(choices=[
        (0, "0分，无"),
        (1, "1分，稀便3~4次/天"),
        (2, "2分，稀便≥5次/天且量在500ml~1500ml之间"),
        (3, "5分，稀便≥5次/天且量＞1500ml"),
    ],
                                  null=True,
                                  blank=True)
    肠内营养耐受得分 = models.SmallIntegerField(
        blank=True,
        null=True,
        help_text=
        "总分0-2分：持续EN，增加或维持原速度，对症治疗；3-4分： 持续EN，减慢速度，2小时后重新评估；5分：暂停EN，并作相应处理，包括停止EN,使用促动力药物，更换EN种类。调整后每4小时重新评估，如稳定输注，无需再调整者，每日评估一次即可。"
    )
    肠外剂型 = models.CharField(max_length=100, blank=True, null=True)
    肠外热量 = models.SmallIntegerField(blank=True, null=True)
    肠外营养天数 = models.SmallIntegerField(blank=True, null=True)
    肠外营养途径 = models.CharField(max_length=25, blank=True, null=True)
    肠外输注方式 = models.CharField(max_length=10, choices=[("串输", "串输"), ("混合输注", "混合输注")], blank=True, null=True)
    肠外营养并发症 = models.CharField(max_length=100, blank=True, null=True)
    评估人 = models.CharField(max_length=10, blank=True, null=True, help_text="默认为当前用户")
    评估时间 = models.DateTimeField(default=datetime.datetime.now())

    def __str__(self):
        return str(self.患者) + "[" + str(self.评估时间) + "]"

    class Meta:
        verbose_name = "营养耐受评估"
        verbose_name_plural = "5.营养耐受评估"
